package com.xujiang.common_core.util.tool;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import com.xujiang.common_core.util.ourexception.SystemException;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.List;

/**
 * @author xujiang
 * @version 2017-07-10 13:39
 */
public class JsonUtils {

    /**
     * 从json中获取int型数据，如果没有获取到，默认获取到0
     * @param name
     * @param jsonObject
     * @return
     */
    public static int getInt(String name,JSONObject jsonObject) {
        return getInt(name,0,jsonObject);
    }


    public static int getInt(String name,int def,JSONObject jsonObject) {
        try {
            return jsonObject.getInt(name);
        } catch (JSONException ignored) {
        }
        return def;
    }

    /**
     * 从jsonObject中通过name获取string，获取失返回" ",一个空的字符串
     * @param name
     * @param jsonObject
     * @return
     */
    public static String getString(String name,JSONObject jsonObject) {
        try {
            return jsonObject.getString(name);
        } catch (JSONException ignored) {
        }
        return "";
    }

    /**
     * 从jsonObject中通过name获取boolean，获取失返回false
     * @param name
     * @param jsonObject
     * @return
     */
    public static boolean getBoolean(String name,JSONObject jsonObject) {
        try {
            return jsonObject.getBoolean(name);
        } catch (JSONException ignored) {
        }
        return false;
    }

    /**
     * 来自 https://github.com/FasterXML/jackson-databind
     * 将传入的类等对象转换成json string
     * @param t
     * @param <T>
     * @return
     * @throws SystemException
     */
    public static <T> String toJson(T t) throws SystemException {
        try {
            return new ObjectMapper().writeValueAsString(t);  //将传入的类等对象转换成string
        } catch (JsonProcessingException e) {
            throw new SystemException(e);
        }
    }

    /**
     * https://github.com/FasterXML/jackson-databind
     * 将json 转换成 类
     * @param json
     * @param clazz
     * @param <T>
     * @return
     * @throws SystemException
     */
    public static <T> T parse(String json, Class<T> clazz) throws SystemException {
        try {
            return new ObjectMapper().readValue(json, clazz);
        } catch (IOException e) {
            throw new SystemException(e);
        }
    }

    /**
     * https://github.com/FasterXML/jackson-databind
     * 将json中的某个值写入类
     * @param json
     * @param parameter
     * @param clazz
     * @param <T>
     * @return
     * @throws SystemException
     */
    public static <T> T parse(String json, String parameter,
            Class<T> clazz) throws SystemException {
        try {
            JSONObject jsonObject = new JSONObject(json);
            return new ObjectMapper().readValue(jsonObject.getString(parameter), clazz);
        } catch (Exception e) {
            throw new SystemException(e);
        }
    }

    /**
     * 从json 中获取 parameter 的string
     * @param json
     * @param parameter
     * @return
     */
    public static String parseString(String json, String parameter){
        try {
            JSONObject jsonObject=new JSONObject(json);
            return jsonObject.getString(parameter);
        } catch (JSONException ignored) {
        }
        return null;
    }

    /**
     * json 获取 parameter 的值到 valueType中 并返回一个list
     * @param json
     * @param parameter
     * @param valueType
     * @param <T>
     * @return
     * @throws SystemException
     */
    public static <T> List<T> parseList(String json, String parameter,
            JavaType valueType) throws SystemException {
        try {
            JSONObject jsonObject = new JSONObject(json);
            return new ObjectMapper().readValue(jsonObject.getString(parameter), valueType);
        } catch (Exception e) {
            throw new SystemException(e);
        }
    }

    /**
     *  调用上面的函数
     * @param json
     * @param parameter
     * @param clazz
     * @param <T>
     * @return
     * @throws SystemException
     */
    public static <T> List<T> parseList(String json, String parameter,
            Class<T> clazz) throws SystemException {
        return parseList(json, parameter, TypeFactory.defaultInstance().constructCollectionType(List.class, clazz));
    }


}
